RecyclerView是Android官方推出的旨在取代ListView、GridView的控件,可以通过导入support-V7进行使用。据官方介绍,该控件用于在有限的窗口中展示大量数据集,同样能实现此效果的有ListView、GridView。
那么有了ListView、GridView之后为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,它提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供不同的LayoutManager、ItemDecoration、ItemAnimator来实现各种各样的效果。
- 控制其显示的布局方式,请设置布局管理器LayoutManager
- 控制Item间的间隔,请实现ItemDecoration
- 控制Item间增删的动画,请实现ItemAnimator
- 控制其点击、长按事件,不好意思请自己写
下面,我们开始进入RecyclerView的体验之旅
build.gradle
要想使用RecyclerView,首先我们要导入support-V7包,Android Studio中需要的build.gradle文件中加入下面代码自动导入V7包。
|
|
RecyclerView实现ListView效果
- 实例化RecyclerView
- 设置RecyclerView的布局(有ListView、GridView和瀑布流三种效果,水平和垂直两个方向)
- 设置RecyclerView的Item分割线
- 设置RecyclerView的Item增删时的动画
- 实例化一个RecyclerViewAdapter
- 设置RecyclerView的Adapter
|
|
主界面布局
RecyclerView的类名全称为android.support.v7.widget.RecyclerView
|
|
分割线DividerItemDecoration
DividerItemDecoration是实现的是RecyclerView作为ListView效果时的分割线。
|
|
实现Adapter
RecyclerViewAdapter用于RecyclerView作为ListView和GridView效果时Adapter,通过其构造函数传入Context和需要绑定的数据集合。一个基本的Adapter里面有需要实现如下功能:
- 创建RecyclerView.ViewHolder的子类
- 视图与数据绑定
- 点击事件回调接口
- Item的增加和删除更新
|
|
RecyclerView的Item布局item_recycleview.xml
|
|
实现RecyclerView
|
|
效果
RecyclerView实现GridView效果
RecyclerView实现GridView与实现ListView效果的不同之处有两点:
- 布局管理器为StaggeredGridLayoutManager
- Item间隔类为DividerGridItemDecoration
DividerGridItemDecoration
|
|
实现
|
|
注意:StaggeredGridLayoutManager构造的第二个参数传一个orientation,如果传入的是StaggeredGridLayoutManager.VERTICAL代表有多少列;那么传入的如果是StaggeredGridLayoutManager.HORIZONTAL就代表有多少行。
效果
RecyclerView实现瀑布流效果
RecyclerView实现瀑布流效果与实现ListView效果的不同之处有三点:
- 布局管理器为StaggeredGridLayoutManager
- Item间隔类为DividerGridItemDecoration
- Adapter不同,实现瀑布流需要在adaper写一个随机的高度来控制每个item的高度就可以了,通常这个高度是由服务端返回的数据高度来控制的。
实现
|
|
注意:StaggeredGridLayoutManager构造的第二个参数传一个orientation,如果传入的是StaggeredGridLayoutManager.VERTICAL代表有多少列;那么传入的如果是StaggeredGridLayoutManager.HORIZONTAL就代表有多少行。
StaggeredAdapter
StaggeredAdapter写一个随机的高度来控制每个item的高度。
|
|
效果
修改分割线
DividerItemDecoration和DividerGridItemDecoration的实现类都是通过读取系统主题中的android.R.attr.listDivider来作为Item间的分割线,并且支持纵向和横向,获取到listDivider熟悉后,该属性的值是个Drawable,在getItemOffsets中,outRect去设置了绘制的范围,onDraw中实现了真正的绘制。
该分割线是系统默认的,你可以在theme.xml文件中找到该属性的使用情况。那么,使用系统的listDivide有什么好处呢?就是方便我们去随意的改变,该属性我们可以直接声明在:
|
|
然后自己写个Drawable即可,下面我们换一种分隔符
|
|
效果如下:
#参考资料
Android RecyclerView 使用完全解析 体验艺术般的控件
Android5.x RecyclerView 应用解析